﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
using pryConvertTXT.BE;
using System.Linq;
using System.Net.Mail;
using System.Net;
using System.Net.Mime;

namespace pryConvertTXT
{
    public partial class FrmMigrarBaseDatos : Form
    {
        private DataTable data;
        private String NotePad = "";

        public FrmMigrarBaseDatos()
        {
            InitializeComponent();
            dgvExcel.AutoGenerateColumns = true;
            data = new DataTable();
            
            //CargarContador();
        }

        //private void CargarContador()
        //{
        //    try
        //    {
        //        clsModulo.listContadorGenerador = new List<GenerarNotepad>();

        //        if (!File.Exists(@"C:\Windows\pryConvert.ini"))
        //        {

        //            foreach (EmpresaClienteBE Item in clsModulo.listEmpresasBE)
        //            {
        //                GenerarNotepad obj = new GenerarNotepad();
        //                obj.Empresa = Item.Nombre;
        //                obj.RUC = Item.RUC;
        //                obj.Ano = clsModulo.Fecha.Year;
        //                obj.Mes = clsModulo.Fecha.Month;
        //                obj.Count = 0;
        //                obj.Estado = true;

        //                clsModulo.listContadorGenerador.Add(obj);
        //            }

        //        }
        //        else
        //        {

        //        }

        //    }
        //    catch (Exception ex)
        //    {

        //    }
        //}


        private void buttonOpen_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
            {
                // En caso de que haya un error, asegúrese de que este botón se desactiva
                buttonExecute.Enabled = false;
                dgvExcel.DataSource = null;
                textBoxConnectionString.Text = "";

                // Guardar el nombre de archivo y el tipo (que es necesaria más adelante)
                textBoxFilename.Text = openFileDialog1.FileName;
                textBoxFilename.Tag = openFileDialog1.FilterIndex;

                // Establezca una conexión con el archivo y leer las hojas y rangos con nombre
                comboBoxSheet.Items.Clear();
                try
                {
                    using (OleDbConnection connection = new OleDbConnection(GetConnectionString()))
                    {
                        connection.Open();

                        // Ver MSDN de "OLE DB colecciones de esquemas (ADO.NET)" para el Microsoft Jet OLE DB Provider
                        // Http://msdn.microsoft.com/en-us/library/cc668764.aspx
                        using (DataTable tables = connection.GetSchema("Tables"))
                        {
                            foreach (DataRow row in tables.Rows)
                                comboBoxSheet.Items.Add((string)row["TABLE_NAME"]);
                        }
                    }

                    // Esto no debería ocurrir nunca, pero de todos modos para comprobar
                    if (comboBoxSheet.Items.Count == 0)
                        throw new Exception("Excel file has no sheets!");
                    comboBoxSheet.SelectedIndex = 0;
                }
                catch (Exception ex)
                {
                    // Mostrar todos los errores
                    MessageBox.Show("[" + ex.GetType().Name + "] " + ex.Message + ex.StackTrace);
                }

                // Si todo ha ido bien, a continuación, active el botón Ejecutar y darle el foco
                buttonExecute.Enabled = true;
                buttonExecute.Focus();
            }
        }

        private void comboBoxSheet_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Asegúrese de que las hojas no sólo (rangos con nombre) puede tener rangos acompañará a éste
            if (!((string)comboBoxSheet.SelectedItem).EndsWith("$"))
            {
                textBoxRange.Text = "";
                textBoxRange.ReadOnly = true;
            }
            else
                textBoxRange.ReadOnly = false;

            SetSelectString();
        }

        private void buttonExecute_Click(object sender, EventArgs e)
        {
            try
            {
                // Borrar el DataGridView y el cuadro de texto de cadena de conexión
                data.Dispose();
                data = new DataTable();
                dgvExcel.DataSource = data;
                textBoxConnectionString.Text = "";

                // Llenar DataGridView y TextBox cadena de conexión
                using (OleDbConnection connection = new OleDbConnection(GetConnectionString()))
                {
                    connection.Open();
                    textBoxConnectionString.Text = GetConnectionString();
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(textBoxSelect.Text, connection))
                    {
                        adapter.Fill(data);
                    }
                }

                tabControl1.SelectedIndex = 0;
            }
            catch (Exception ex)
            {

                MessageBox.Show("[" + ex.GetType().Name + "] " + ex.Message + ex.StackTrace);
            }
        }
        private string GetConnectionString()
        {
            // Nombre de la hoja de cálculo Excel para abrir
            string filename = textBoxFilename.Text;

            // Nota: la matriz Tipos coincide exactamente con las entradas en openFileDialog1.Filter
            string[] Types = {
                    "Excel 12.0 Xml", // For Excel 2007 XML (*.xlsx)
                    "Excel 12.0", // For Excel 2007 Binary (*.xlsb)
                    "Excel 12.0 Macro", // For Excel 2007 Macro-enabled (*.xlsm)
                    "Excel 8.0", // For Excel 97/2000/2003 (*.xls)
                    "Excel 5.0" }; // For Excel 5.0/95 (*.xls)
            // Nota: openFileDialog1.FilterIndex se guardan en textBoxFilename.Tag
            string Type = Types[(int)textBoxFilename.Tag - 1];

            // True si la primera fila en los datos de Excel es un encabezado (usado para nombres de columnas, no datos)
            bool Header = checkBoxHeader.Checked;

            // True si las columnas que contienen diferentes tipos de datos se tratan como texto
            // (Tenga en cuenta que las columnas que contengan únicamente los tipos enteros siguen siendo tratadas como número entero, etc)
            bool TreatIntermixedAsText = checkBoxIntermixed.Checked;

            // Construir la cadena de conexión real
            OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();
            builder.DataSource = filename;
            if (Type == "Excel 5.0" || Type == "Excel 8.0")
                builder.Provider = "Microsoft.Jet.OLEDB.4.0";
            else
                builder.Provider = "Microsoft.ACE.OLEDB.12.0";
            builder["Extended Properties"] = Type +
                ";HDR=" + (Header ? "Yes" : "No") +
                ";IMEX=" + (TreatIntermixedAsText ? "1" : "0");
            

            return builder.ConnectionString;
        }
        private void SetSelectString()
        {
            // Sobrescribe el cuadro de texto seleccionado con la selección hoja junto con el rango (opcional)
            textBoxSelect.Text = "SELECT " + textBoxRange.Text + " FROM [" + (string)comboBoxSheet.SelectedItem + "]";
            
            if (textBoxRange.Text.Trim() == "")
            {
                textBoxSelect.Text = "SELECT * FROM [" + (string)comboBoxSheet.SelectedItem + "]";
            }
        }

        private void textBoxRange_TextChanged(object sender, EventArgs e)
        {
            SetSelectString();
        }


        private void btnVistaPreviaN_Click(object sender, EventArgs e)
        {

            txtExcel.Text = MostrarVistaPrevia();

        }

        private string MostrarVistaPrevia()
        {
            try
            {
                NotePad = "";

                foreach (DataGridViewRow row in dgvExcel.Rows)
                {
                    String fila = "";
                    foreach (DataGridViewCell cell in row.Cells)
                    {

                        fila += cell.Value.ToString().Trim() + " | ";

                    }

                    fila = fila.Substring(0,fila.LastIndexOf('|')).Trim();
                    fila += "\n";
                    NotePad += fila;
                }
                
                return NotePad;
            }
            catch (Exception ex)
            {
                return String.Empty;
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                pgbCarga.Value = 0;
                if (Validar())
                {

                    if (MessageBox.Show("Esta seguro que desea continuar.", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        int max = dgvExcel.Rows.Count;
                        pgbCarga.Maximum = max;

                        if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK)
                        {
                            String RUC = dgvEmpresa.CurrentRow.Cells["RUC"].Value.ToString();
                            String pach = folderBrowserDialog1.SelectedPath;
                            String File = pach + "\\" + txtNombre.Text.Trim() + "_" + RUC + ".txt";

                            StreamWriter oSW = new StreamWriter(File);

                            foreach (DataGridViewRow row in dgvExcel.Rows)
                            {
                                String line = "";
                                foreach (DataGridViewCell cell in row.Cells)
                                {
                                    line += cell.Value.ToString() + "|";
                                }

                                line = line.Substring(0, line.LastIndexOf('|')).Trim();
                                oSW.WriteLine(line);
                                pgbCarga.Value += 1;

                            }

                            oSW.Flush();
                            oSW.Close();

                            //txtExcel.SaveFile(File);
                            //pgbCarga.Value = 0;
                            //MessageBox.Show("El archivo se genero correctamente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            //this.EnviarMessage(File);
                            //GuardarDato(RUC);
                        }
                    }

                }
                else
                {
                    MessageBox.Show("No puede dejar campos vacíos.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex) { }
        }

        private Boolean Validar()
        {
            lblNombre.Visible = txtNombre.Text.Trim() == "";
            lblRUC.Visible = txtRUC.Text == "";
            lblArchivo.Visible = txtArchivo.Text == "";

            if (txtNombre.Text.Trim() == "" || txtRUC.Text == "" || txtArchivo.Text == "" || dgvExcel.RowCount == 0)
                return false;
            else
                return true;
        }

        private void EnviarMessage(String file)
        {
            MailMessage mail = new MailMessage();

            mail.From = new MailAddress("sistemas@soltecn.com");
            mail.To.Add("jperez@soltecn.com");
            mail.To.Add("ventas@soltecn.com");
            mail.Subject = ("");
            mail.Body = ("");
            
            Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
            // Add time stamp information for the file.
            ContentDisposition disposition = data.ContentDisposition;
            disposition.CreationDate = System.IO.File.GetCreationTime(file);
            disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
            disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
            // Add the file attachment to this e-mail message.
            mail.Attachments.Add(data);

            SmtpClient client = new SmtpClient();
            client.Host = "";
            //s.Port = 25;
            client.EnableSsl = false;
            client.UseDefaultCredentials = true;
            //s.Credentials = new System.Net.NetworkCredential("sistemas@soltecn.com","123456abc@");
            client.Credentials = CredentialCache.DefaultNetworkCredentials;
            client.Send(mail);
         
        }

        private void btnVistaPrevia_Click(object sender, EventArgs e)
        {
            txtExcel.Text = MostrarVistaPrevia();
            tabControl1.SelectedIndex = 1;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            if (cboAno.SelectedIndex > 0 && cboMes.SelectedIndex > 0)
            {
                clsModulo.Fecha = Convert.ToDateTime("01/" + (cboMes.SelectedIndex + 1) + "/" + cboAno.Text);
            }                
            clsModulo.AsignarEstado(clsModulo.Fecha);


            var q = from E in clsModulo.listEmpresasBE
                    where E.Nombre.ToUpper().StartsWith(txtBuscar.Text.Trim().ToUpper())
                    select E;

            dgvEmpresa.Rows.Clear();
            
            int i = 0;
            foreach (EmpresaClienteBE Item in q.ToList())
            {
                dgvEmpresa.Rows.Add();
                dgvEmpresa.Rows[i].Cells["Empresa"].Value = Item.Nombre;
                dgvEmpresa.Rows[i].Cells["RUC"].Value = Item.RUC;
                dgvEmpresa.Rows[i++].Cells["Activo"].Value = Item.Activo;

            }

            if (dgvEmpresa.Rows.Count > 0)
                dgvEmpresa.Rows[0].Selected = false;
        }

        private void dgvEmpresa_SelectionChanged(object sender, EventArgs e)
        {
            Boolean estado;            
            estado = Convert.ToBoolean(dgvEmpresa.CurrentRow.Cells["Activo"].Value);
            if (estado == true)
            {
                splitContainer1.Panel2.Enabled = true;
            }
            else
            {
                splitContainer1.Panel2.Enabled = false;
            }

            txtRUC.Text = dgvEmpresa.CurrentRow.Cells["RUC"].Value == null ? "" : dgvEmpresa.CurrentRow.Cells["RUC"].Value.ToString();
            txtArchivo.Text = txtNombre.Text.Trim() + "_" + txtRUC.Text.Trim() + ".txt";
        }

        private void FrmMigrarBaseDatos_Load(object sender, EventArgs e)
        {
            btnBuscar.PerformClick();
        }

        private void txtNombre_KeyUp(object sender, KeyEventArgs e)
        {
            txtArchivo.Text = txtNombre.Text.Trim() + "_" + txtRUC.Text.Trim() + ".txt";
        }


    }
}